perm filename T1.F4[M11,LCS]4 blob sn#411134 filedate 1979-01-15 generic text, type T, neo UTF8
00100	C*** 33 PARAMS SEEMS TO BE LIMIT IN THIS VERSION. (30 IN 'SCORE') *****
00200		SUBROUTINE TRANS(JJJ)
00300	CIN   DIMENSION IINS(108)
00400		DIMENSION NN(80)
00500	C  W(35) FOR PARAMETERS
00600	CIN   COMMON /TR/I(80),RX(100),JX(100),LX(12),INST(27,4),K
00700	C  THE 'ROUT' COMMON BLOCK IS 1ST OUTPUT BLOCK IN 'PASS3'.
00800	      COMMON /ROUT/I(200) ,RX(80),JX(80)  /TR/LX(12),K
00900	     1,INSNUM(27),P(30),NPAR(27),JSEM,IPRNT,IPP
01000	     1,SRATE,RNCHN,RMAG,INUM,INS,MM,M,N,JJ,X,Y,IK
01100	     1,ENDX,J  /KNAM/IPLAY,JFLNM  /IFIRST/IFIRST,IDT
01200		1 /INST/INST(27)
01300		1 /WDZ/WDZ(14),JWD(12)
01400	      COMMON /SBFILN/SBFILN /AR/IOP /IGEN/IGEN /JP/JPRNT
01500	      COMMON LL  /P/W(1)  /CONV/ICONV /FQDR/FQDR(28,27),INSN
01600	      INTEGER FQDR
01700	C****************CHECK NEAR HERE FOR NEEDED CHANGES **************
01800	CXX   DOUBLE PRECISION IDBL,JANP,JBLA,JFLNM,JDBG,
01900	CXX	1 INST,INAM,JSEMI,ICOLON
02000	      EQUIVALENCE (LESS,LX(9)),(IX,IXJ,JX),(RX2,RX(3)),
02100	     1(P2,P(2)),(RX3,RX(5)),(I3,I(3)),(ISEMI,LX(2))
02200	     1,(IBLA,LX(1)),(IAST,LX(3)),(IINS,INST)
02300	     1,(IAROW,LX(7)),(W1,W),(W3,W(3)),(W2,W(2))
02400	CXX   DATA LX/' ',';', '*','/','-','+'
02500	CXX	1,'←','=', '<', ',', '(', ')'/,  IFIRST/-1/,IOPEN/-1/
02600	C****************CHECK NEAR HERE FOR NEEDED CHANGES **************.
02700	C  THE BIG NUMBER BELOW IS A LEFT ARROW.
02800	
02900	      DATA LX/' ',';', '*','/','-','+'
03000	     1,"575004020100,'=','<' ,',' ,'(', ')'/,
03100	     1  IDOT/'.'/, IDEV/1/,JPRNT/1/,JFLNM/'TRNS'/
03200		1,JBLA/'    '/,JDBG/'#   '/,JPERC/'%   '/,JSEMI/';   '/
03300	C*** THIS VERSION STARTS OUT WITH DEFAULT OUTPUT TO FILE: TRNS.DAT
03400	      DATA RMAG/.0512/,INUM/0/,SRATE/12800./,RNCHN/1./,JQUOT/'"    '/
03500		1,JEXP/'!   '/,JANP/'&   '/,ICONV/-1/,JCOLON/':   '/
03600	C ICONV=-1 MEANS WRITE A SOUND FILE. (=0 = WRITE A FILE FOR 'SMPLS' PROG.)
03700	
03800		GO TO (555,500) JJJ
03900	555      IF(IFIRST)404,  5,5  
04000	404      IGEN=-1
04100		KA=1
04200	C KA IS POINTER TO INPUT ARRAY
04300		IF(INUM.NE.0)GO TO 30
04400		DO 411 K=1,27 
04500	411	INST(K)=0
04600	CIN	DO 411 K=1,108
04700	CIN411	IINS(K)=0
04800	C ZERO OUT INSTR. NAME ARRAY.
04900	30    IPLAY=0
05000	      ENDX=0
05100		KK=0
05200	      JSEM=0
05300	      INS=-1
05400	402      IDEV=1
05500	412      TYPE 1
05600	1	 FORMAT(' INPUT? '$)
05700	100      FORMAT(' >'$)
05800	2      FORMAT(A4)
05900	      ACCEPT 2,IDBL
06000	C IDBL WILL HAVE TO BE DOUBLE PREC. ON PDP11 ************
06100	      IF(IDBL.NE.JBLA)GO TO 400
06200	      IDEV=5
06300	      GO TO 5
06400	400      IF(IDBL.NE.JANP)GO TO 602    
06500		JPRNT=-JPRNT
06600		GO TO 412
06700	C!*** & IS PRNT-NOPRNT FLIPFLOP
06800	602      IF(IDBL.NE.JQUOT)GO TO 408
06900	C!*** " FOR INSTRUMENT LIST.
07000	      DO 606 K=1,INUM
07200		JK=INSNUM(K)
07300		MM=NPAR(JK)-2
07400	606      TYPE 607,INST(K),JK,MM
07500	CIN606      TYPE 607,(INST(K,L),L=1,4),JK,NPAR(JK)
07600	CC606      TYPE 607,(INST(K,L),L=1,4),INSNUM(K),JK
07700	      GO TO 402
07800	607      FORMAT(1X,A4,'  NUM=',I2,'  PARAMS=',I2)      
07900	CIN607      FORMAT(1X,4A1,'  NUM=',I2,'  PARAMS=',I2)      
08000	C!*** PRINTS INST INFO.
08100	408	IF(IDBL.NE.JEXP)GO TO 603
08200	C TRIGGERS ICONV FLIPFLOP
08300		IF(ICONV)GO TO 2408
08400		ICONV=-1
08500		TYPE 3408
08600		GO TO 412
08700	2408	ICONV=0
08800		TYPE 4408
08900		GO TO 412
09000	3408	FORMAT(' OUTPUT=TEST.SND'/)
09100	4408	FORMAT(' OUTPUT=TEST.DAT'/)
09200	603	IF(IDBL.EQ.JPERC)CALL PLAY
09300	C TYPE % TO RE-PLAY SOUND
09400	CXX	IF(IDBL.NE.JDBG)GO TO 410
09500	CXX4448	TYPE 4023
09600	CXX4446	TYPE 4445
09700	CXX	ACCEPT 51,KI
09800	CXX	IF(KI.EQ.0)GO TO 4022
09900	CXX	IF(KI.GT.0)GO TO 4447
10000	C******** THIS STUFF FOR DIAGNOSIS
10100	CXX	IF(KI.EQ.-1)TYPE 2325,IGEN
10200	CXX	IF(KI.EQ.-2)TYPE 2325,IPRNT
10300	CXX	IF(KI.EQ.-3)TYPE 2325,IPLAY
10400	CXX	IF(KI.EQ.-4)TYPE 2325,JSEM
10500	CXX	IF(KI.EQ.-5)TYPE 2325,J
10600	CXX	IF(KI.EQ.-6)TYPE 2325,MM
10700	CXX	GO TO 4446
10800	CXX4022	IF(IDEV.EQ.1)GO TO 402
10900	C GO BACK TO 'INPUT' OR '>'
11000	CXX	GO TO 502
11100	C THIS WILL TYPE OUT ELEMENTS OF LX ARRAY.
11200	CXX4447	TYPE 2326,LX(KI)
11300	CXX	TYPE 2325,LX(KI)
11400	CXX	GO TO 4446
11500	CXX4445	FORMAT(' TYPE LX NUMB.   '$)
11600	CXX4023	FORMAT(' IGEN, IPRNT, IPLAY, JSEM, J, MM'/)
11700	CXX2324	FORMAT(1X12F/)
11800	CXX2325	FORMAT(1X5I/)
11900	2326	FORMAT(1X80A1)
12000	410	IF(IDBL.EQ.JCOLON)CALL EXIT
12100	C TYPE ':' TO EXIT AND CLOSE ALL FILES.
12200		CALL IFILE(1,IDBL)
12300	C NOW IT BELIEVES YOU'VE TYPED A FILE NAME.
12400	CX	CALL OPEN(1,IDBL,0,'RDO')
12500	4      FORMAT(80A1)
12600	C****************
12700	CX	TYPE 2325,JSEM
12800	CX	TYPE 2325,J
12900	CX	TYPE 2325,MM
13000	
13100	5     IF(KA.NE.1)GO TO 521
13200	502      IF(IDEV.NE.5)GO TO 601
13300	C*******************************
13400	      IF(IGEN.NE.2)IGEN=-1
13500	503      TYPE 100
13600	C*******************************
13700	601	KA=1
13800		READ(IDEV,4,END=404)NN
13900	121	DO 421 LEND=80,1,-1
14000	C FIND LAST CHAR. IN LINE
14100	421	IF(NN(LEND).NE.IBLA)GO TO 621
14200	C NOW WE'VE FOUND A BLANK LINE
14300		IF(IDEV.EQ.1)GO TO 601
14400		GO TO 402
14500	621	IF(IDEV.EQ.5)GO TO 521 
14600		IF(JPRNT.LT.0)TYPE 2326,(NN(IJI),IJI=1,LEND)
14700	521	IF(KK.EQ.0)JA=0
14800	C KK IS FLAG FOR CONTINUATION LINES.
14900		DO 21 LSEM=KA,LEND
15000		LS=NN(LSEM)
15100		IF(LS.NE.LESS)GO TO 21
15200		KK=0
15300		GO TO 601
15400	21	IF(LS.EQ.ISEMI)GO TO 821
15500	C SET FLAG TO LOOP BACK TO READ ANOTHER LINE
15600		KK=-1
15700		GO TO 721
15800	
15900	821	KK=0
16000	C SET KK TO 0 EVERY TIME WE HIT A SEMICOLON
16100	221	IF(LSEM.EQ.1)GO TO 721
16200		KB=LSEM-1
16300		IF(NN(KB).NE.IBLA)GO TO 721
16400	C DELETE BLANKS BEFORE A SEMICOLON
16500		NN(KB)=ISEMI
16600		NN(LSEM)=IBLA
16700		IF(LEND.EQ.LSEM)LEND=LEND-1
16800		LSEM=LSEM-1
16900		GO TO 221
17000	721	IF(JA.EQ.0)GO TO 921
17100		JA=JA+1
17200		I(JA)=IBLA
17300	C INSERT A BLANK IF A CONTINUATION LINE.
17400	921   	KC=IBLA
17500	C LEADING BLANKS AND MULTIPLE BLANKS ARE DELETED.
17600		DO 321 KB=KA,LSEM
17700	C LSEM IS CHAR COUNT IN I ARRAY NOW (LOCATES THE SEMI COLON)
17800		K=NN(KB)
17900		IF(K.NE.IBLA)GO TO 1021
18000		IF(KC.EQ.IBLA)GO TO 321
18100	C DELETE STRINGS OF BLANKS
18200	1021	JA=JA+1
18300		I(JA)=K
18400		KC=K
18500	321	CONTINUE
18600	C CURRENTLY CAN STORE 200 CHARS. IN I ARRAY. (ENOUGH FOR 30 PARAMS?)
18700		KA=LSEM+1
18800		IF(KA.GT.LEND)KA=1
18900		IF(KK.NE.0)GO TO 502
19000	C GO READ MORE IF NO SEMICOLON WAS FOUND.
19100		IF(I(1).EQ.ISEMI)GO TO 5
19200	C CATCHES DUPLICATE SEMICOLON
19300	1408      DO 407 K=1,80 
19400	407      JX(K)=IBLA
19500	406      MM=0
19550	C INIT VARIOUS THINGS
19600		DO 4061 J=2,80,2
19700	4061	RX(J)=0
19800	        J=-1      
19900	      IPRNT=0
20000	119      JI=0
20100	9      M=0
20200		N=JI+1
20300	6      JI=JI+1
20400		   KCHAR=I(JI)
20500	      DO 7 L=1,12
20600	7      IF(KCHAR.EQ.LX(L))GO TO 8
20650	C JUMP OUT IF PUNCT., SPACE, SEMI., ETC.
20700	      M=M+1
20800	      GO TO 6            
20900	C!**** NO STRING CAN EXCEED 10 CHARS.
21000	8       IF(M.EQ.0)GO TO 140
21100	      IF(M.GT.10)M=10
21200	      MM=MM+1
21300	      IF(MM.LE.40)GO TO 88
21400	      TYPE 888,(I(JJ),JJ=N,N+9)
21500	      STOP
21600	888      FORMAT(' LINE TOO LONG -- ',10A1)
21700	88      JJ=I(N)
21800		IF(JJ.GT.'9')GO TO 16  
21900		IF(JJ.NE.IDOT.AND.JJ.LT.'0')GO TO 16
22000	CXX	IF(JJ.GT.8249)GO TO 16  
22100	CXX	IF(JJ.NE.IDOT.AND.JJ.LT.8240)GO TO 16
22200	C**** 8240='0'  8249='9'
22300	C!***** JUMP IF 1ST CHAR. IS A LETTER.
22400		Y=0
22500	      DOT=10.
22600	      DO 18 JK=N,N+M-1
22700	      KB=I(JK)
22800	      IF(KB.NE.IDOT)GO TO 17
22900	      DOT=.1
23000	      GO TO 18
23200	17    X=NASCI(KB)                 
23300	C!**** CHANGE ASCII INTO NUMBER
23400	      IF(DOT.LT.1)GO TO 19
23500	      Y=Y*DOT+X
23600	      GO TO 18
23700	19      Y=Y+X*DOT
23800	      DOT=DOT/10.
23900	18      CONTINUE
23950		IF(IGEN.EQ.2)Y=Y*100+1000.
23975	C ABOVE PUTS CONSTANTS IN INS DEFINITIONS. PLUS ONLY. LIMIT??
24000	      RX(MM*2-1)=Y
24100	      RX(MM*2)=-9999.0
24200	      GO TO 140
24300	
24400	16	JK=MM*2-1
24500	CX	JX(JK)=0
24600	CX	RX(JK)=0
24700	CX	JX(JK+1)=0
24800	CX	RX(JK+1)=0
24900	        CALL MPACK(M,I(N),JX(JK),N)
25000	C N=CURRENT POINTER TO I ARRAY - USED LATER TO LOCATE INST. NAMES.
25100		IJ=JX(JK)
25200		IF(IJ.GE.0)GO TO 144
25300	C IF IJ < 0, THEN IT'S A LETTER
25400		JX(MM*2)=M
25500	C SAVE THE WD CNT OF POTENTIAL INST. NAME.
25600		GO TO 143
25700	144	IF(IJ.NE.408)GO TO 140
25750	C "WORD" TYPES OUT RESERVED WORD LIST
25800		TYPE 244,WDZ,JWD
25900		GO TO 503
26000	244	FORMAT(15(1XA4))
26100	140      IF(IJ.EQ.400)GO TO 5
26200	C  400='PLAY;' THIS CAN BE THROWN AWAY NOW.
26700	143	IF(KCHAR.EQ.IBLA)GO TO 10
26800	      IF(L.EQ.8)KCHAR=IAROW      
26900	C!::: CHANGE = INTO ←
27200	141   MM=MM+1
27300		KI=MM*2-1
27400		JX(KI)=KCHAR
27500	10      IF(JI.EQ.JA)GO TO 15
27600	C  JA POINTS TO LAST CHAR. TO LOOK AT FOR NOW.
27700	1010	IF(I(JI+1).NE.IBLA)GO TO 11
27800	      JI=JI+1
27900	      GO TO 1010
28000	11	IF(JI.LT.JA)GO TO 9
28100	C NOW WE HAVE ALL ITEMS IN IX ARRAY
28200		IF(MM.GT.1)GO TO 15
28300	C CATCH 'WORD  ;' AT END OF LINE
28400		IF(M.EQ.0)GO TO 5
28500	15      MM=MM*2
29000	142      J=-1      
29100	      IF(INS.LT.0)GO TO 305
29200	      IF(INS.EQ.2)GO TO 305
29300	      MM=0
29400	      INS=-1    
29500	C!***** NOW INITIALIZATION COMPLETE
29600	      GO TO 5
29700	50      LL=LL-1
29800		IF(IGEN)308,309,309
29900	CC50      IF(IGEN)308,309,309
30000	CC309      LL=LL-1
30100	CC309   IF(JSEM.LE.0.AND.IGEN.EQ.1)IGEN=-1   
30200	309   IF(IJ.EQ.12)IGEN=-1   
30300	C!*** FOUND 'END'
30400	      GO TO 59
30500	308      W1=1
30600		IK=W2
30700	      IF(LL.GT.NPAR(IK))GO TO 56
30800	54      IF(LL.LT.3)LL=3
30900	      DO 55 K=LL,NPAR(IK)
31000	55      W(K)=P(K-2)    
31100	C!***** GET INFO ALREADY IN PARAMS
31200	56      DO 57 K=3,LL
31300	57      P(K-2)=W(K)      
31400	C!**** FILL UP P LIST AGAIN
31500	      X=W3            
31600	C!*** EXCHANGE W2 AND W3, ACTION TIME, INST #
31700	      W3=W2
31800	      W2=X
31900	58      LL=NPAR(IK)
32000	      DO 52 K=5,LL
32100		KI=FQDR(K-4,IK)
32200		IF(KI)53,52,2352
32300	2352      W(K)=RMAG/W(K)
32400	      GO TO 52
32500	53      W(K)=RMAG*W(K)
32600	52      CONTINUE
32700	      IF(ENDX.LT.W2+P2)ENDX=W2+P2
32800	59       IF(W1.NE.2.)GO TO 592
32900		IF(LL.EQ.2)GO TO 597
33000	C JUMP IF 'END' OF INS DEF.
33100		IF(LL.NE.3)GO TO 595
33200	C  JUMP IF NOT AN INST DEF.
33300		PSV=0
33400		SV=35
33500	C EXPLAIN USE OF STORAGE PARAMS!!
33600		INSN=W3
33700	C  INS DEF NUM.
33800		DO 586 K=1,28
33900	C CLEAR FREQ-DUR FLAGS FOR THIS INST.
34000	586	FQDR(K,INSN)=0
34100	CC	JINS=INUM
34200	C LIST OF INST NAMES MUST FOLLOW 'INS 0 N;'  !!!ALWAYS!!!
34300	CIN596	INUM=INUM+1
34400	CIN596	READ(IDEV,2)INST(INUM)
34500	596	READ(IDEV,2,END=587)INAM
34600		IF(INAM.EQ.JSEMI)GO TO 592
34700	C LIST OF INST NAMES TERMINATES WITH ';'.
34800		DO 588 K=1,INUM
34900		IF(INAM.NE.INST(K))GO TO 588
35000		INST(K)=INAM
35100		INSNUM(K)=INSN
35200		GO TO 589
35300	587	PAUSE 'MISSING SEMICOLON'
35400	588	CONTINUE
35500		INUM=INUM+1
35600		INST(INUM)=INAM
35700	CIN	READ(IDEV,4)(INST(INUM,K),K=1,4)
35800	CIN	IF(INST(INUM,1).EQ.ISEMI)GO TO 599
35900	C LIST OF INST NAMES TERMINATES WITH ';'.
36000		INSNUM(INUM)=INSN
36100	589	IF(JPRNT)TYPE 244,INAM
36200	CIN	IF(JPRNT)TYPE 2326,(INST(INUM,K),K=1,4)
36300		GO TO 596
36400	CIN599	INUM=INUM-1
36500	
36600	595	DO 593 K=3,LL
36700		X=W(K)
36800		IF(X.LT.0.OR.X.GT.100)GO TO 593
36900		IF(X.GT.PSV)PSV=X
37000	C CHECK FOR OVERLAPPING PARAM NUMS.
37100	593	CONTINUE
37200		 IF(W3.NE.102.AND.W3.NE.105.AND.W3.NE.111.AND.W3.NE.104
37300		1 .AND.W3.NE.115)GO TO 592
37400	C 115=NOS, 102=OSC, 105=ENV, 104=RAI (3 STOR. LOCS), 111=RAH (2 STOR. LOCS)
37500	C NEXT SETS UP STORAGE LOCATIONS FOR OSC, ENV, RAN, AND RAH.
37600		X=W3
37700	594	LL=LL+1
37800		W(LL)=SV
37900		SV=SV-1
38000	C DECREMENT THE HIGH PARAM NUM.
38100		IF(SV.LT.PSV)PAUSE 'PARAMETER OVERLAP'
38200	CIN	IF(SV.LT.PSV)CALL ERROR(5)
38300	C  IF STORAGE PARAM NUM. OVERLAPS WITH INSTS/'S PARAMS = ERROR
38400		IF(X.NE.111.AND.X.NE.104)GO TO 592
38500		IF(X.EQ.111)X=0
38600		IF(X.EQ.104)X=111
38700		GO TO 594
38800	
38900	597	NPAR(INSN)=PSV
39000	C SAVE THE HIGHEST PARAM NUM.
39100	
39200	592	IF(JPRNT.GE.0)GO TO 591
39300	      TYPE 51,LL,(W(K),K=1,LL)
39400	CXX   WRITE(22,51)LL,(W(K),K=1,LL)
39500	C ABOVE WRITES ONTO FILE 'D.DAT' *** TEMPORARY FOR DEBUGGING.
39600	591      IDT=2
39700	CZZ ????	IF(IOPEN.LT.0)CALL OFILE(21,JFLNM)
39800	C OPENS FILE, IF NOT ALREADY OPEN.
39900	CZZ	WRITE(21)LL,(W(K),K=1,LL)
40000		RETURN
40100	
40200	500      IFIRST=0
40300	      IF(IGEN.EQ.0)IGEN=-1
40400	      IF(W1.NE.6)GO TO 555
40500	      RETURN
40600	C  W1=6 = 'FINISH;'  [W ARRAY IS EQUIV. TO P ARRAY IN MUSIC5]
40700	
40800	306      IF(JPRNT.LT.0)TYPE 1307,(W(K),K=1,LL-1)
40900		      IF(JPRNT.GT.0)TYPE 307,(W(K),K=1,LL-1)
41000	      IPRNT=0                  
41100	C!** RESET NO-PRNT FLAG
41400	      INS=-1
41450		GO TO 5
41500	CC      IF(J.GE.MM-1)GO TO 5      
41600	C!** GO READ ANOTHER LINE
41700	305	CALL MSCAN
42100		IF(IJ.EQ.401)GO TO 500
42200	C 401=FINISH WAS FOUND.
42300		IF(IPRNT.LT.0)GO TO 306
42400		IF(JSEM.EQ.0)GO TO 5
42500		GO TO 50
42600	51      FORMAT(I3,35F10.3/)
42700	307      FORMAT('+',F8.2,$)
42800	1307      FORMAT(F10.3)
42900	      END
43000	
43100		FUNCTION NASCI(N)
43200		DATA IEX/536870912/,IZERO/'0'/
43300	C THIS BIG NUMBER MUST BE CHANGED ON PDP11***************
43400		NASCI=(N-IZERO)/IEX
43500	C CONVERTS SINGLE ASCII CHARACTER TO INTEGER.
43537	CXX	NASCI=N-8240
43575	C  THIS FORM FOR PDP11
43600		END
43700